package com.nebor.product.application.controller;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.nebor.product.application.convert.ProductCategoryDtoConverter;
import com.nebor.product.application.convert.ProductInfoDtoConverter;
import com.nebor.product.application.dto.ProductCategoryDTO;
import com.nebor.product.application.dto.ProductInfoDTO;
import com.nebor.product.common.entity.Result;
import com.nebor.product.domain.bo.ProductCategoryBO;
import com.nebor.product.domain.bo.ProductInfoBO;
import com.nebor.product.domain.service.ProductInfoDomainService;
import com.nebor.product.domain.service.impl.ProductInfoDomainServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/product/info")
@Slf4j
public class ProductInfoController {

    @Resource
    private ProductInfoDomainService productInfoDomainService;


    /**
     * 新增商品信息
     * @param productInfoDTO
     * @return
     */
    @PostMapping("/add")
    public Result<Boolean> add(@RequestBody ProductInfoDTO productInfoDTO) {
        try{
            if(log.isInfoEnabled()){
                log.info("ProductCategoryController.add.dto:{}", JSON.toJSONString(productInfoDTO));
            }
            //先做log

            Preconditions.checkNotNull(productInfoDTO.getProductType(),"商品类型不能为空");
            Preconditions.checkArgument(!StringUtils.isBlank(productInfoDTO.getProductName()),"商品名称不能为空");
            Preconditions.checkNotNull(productInfoDTO.getProductDescription(),"描述不能为空");
            //做check
            ProductInfoBO productInfoBO = ProductInfoDtoConverter.INSTANCE.convertDtoToBo(productInfoDTO);
            //转类型
            productInfoDomainService.add(productInfoBO);
            //调上一层服务
            return Result.ok(true);
        }catch (Exception e){
            log.error("SubjectCategoryController.add.error:{}", e.getMessage(),e);
            return Result.fail("新增商品信息失败");
        }
    }
    /**
     * 删除商品信息
     * @param productInfoDTO
     * @return
     */
    @PostMapping("/delete")
    public Result<Boolean> delete(@RequestBody ProductInfoDTO productInfoDTO) {
        try{
            if(log.isInfoEnabled()){
                log.info("ProductCategoryController.delete.dto:{}", JSON.toJSONString(productInfoDTO));
            }
            //先做log

            Preconditions.checkNotNull(productInfoDTO.getId(),"商品id不能为空");

            //做check
            ProductInfoBO productInfoBO = ProductInfoDtoConverter.INSTANCE.convertDtoToBo(productInfoDTO);
            //转类型
            productInfoDomainService.delete(productInfoBO);
            //调上一层服务
            return Result.ok(true);
        }catch (Exception e){
            log.error("SubjectCategoryController.delete.error:{}", e.getMessage(),e);
            return Result.fail("删除商品信息失败");
        }
    }
    /**
     * 更新商品信息
     * @param productInfoDTO
     * @return
     */
    @PostMapping("/update")
    public Result<Boolean> update(@RequestBody ProductInfoDTO productInfoDTO) {
        try{
            if(log.isInfoEnabled()){
                log.info("ProductCategoryController.update.dto:{}", JSON.toJSONString(productInfoDTO));
            }
            //先做log

            Preconditions.checkNotNull(productInfoDTO.getId(),"商品id不能为空");

            //做check
            ProductInfoBO productInfoBO = ProductInfoDtoConverter.INSTANCE.convertDtoToBo(productInfoDTO);
            //转类型
            productInfoDomainService.update(productInfoBO);
            //调上一层服务
            return Result.ok(true);
        }catch (Exception e){
            log.error("SubjectCategoryController.update.error:{}", e.getMessage(),e);
            return Result.fail("删除商品信息失败");
        }
    }
    /**
     * 查询商品信息
     * @param productInfoDTO
     * @return
     */
    @PostMapping("/query")
    public Result<ProductInfoDTO> query(@RequestBody ProductInfoDTO productInfoDTO) {
        try{
            if(log.isInfoEnabled()){
                log.info("ProductCategoryController.query.dto:{}", JSON.toJSONString(productInfoDTO));
            }
            //先做log

            Preconditions.checkNotNull(productInfoDTO.getId(),"商品id不能为空");

            //做check
            ProductInfoBO productInfoBO = ProductInfoDtoConverter.INSTANCE.convertDtoToBo(productInfoDTO);
            //转类型
            ProductInfoBO bo = productInfoDomainService.query(productInfoBO);

            ProductInfoDTO dto = ProductInfoDtoConverter.INSTANCE.convertBoToDto(bo);
            //调上一层服务
            return Result.ok(dto);
        }catch (Exception e){
            log.error("SubjectCategoryController.query.error:{}", e.getMessage(),e);
            return Result.fail("查询商品信息失败");
        }
    }
    /**
     * 查询所有商品信息
     * @param productInfoDTO
     * @return
     */
    @PostMapping("/queryAll")
    public Result<List<ProductInfoDTO>> queryAll(@RequestBody ProductInfoDTO productInfoDTO) {
        try{
            if(log.isInfoEnabled()){
                log.info("ProductCategoryController.queryAll.dto:{}", JSON.toJSONString(productInfoDTO));
            }
            //先做log

            //做check
            ProductInfoBO productInfoBO = ProductInfoDtoConverter.INSTANCE.convertDtoToBo(productInfoDTO);
            //转类型
            List<ProductInfoBO> boList = productInfoDomainService.queryAll(productInfoBO);

            List<ProductInfoDTO> dtoList = ProductInfoDtoConverter.INSTANCE.convertBoToDtoList(boList);
            //调上一层服务
            return Result.ok(dtoList);
        }catch (Exception e){
            log.error("SubjectCategoryController.queryAll.error:{}", e.getMessage(),e);
            return Result.fail("查询所有商品信息失败");
        }
    }
}
